package com.mazaiting.generator.controller;

import com.mazaiting.common.core.domain.result.Option;
import com.mazaiting.common.core.ex.exceptions.BusinessException;
import com.mazaiting.common.core.ex.exceptions.EmptyObjectException;
import com.mazaiting.generator.config.GenDataSource;
import com.mazaiting.generator.domain.entity.DatasourceEntity;
import com.mazaiting.generator.domain.form.DatasourceForm;
import com.mazaiting.generator.domain.query.DatasourceQuery;
import com.mazaiting.generator.domain.vo.DatasourceVO;
import com.mazaiting.generator.service.IDatasourceService;
import com.mazaiting.generator.utils.DbUtil;
import com.mazaiting.mybatisplus.domain.vo.BasePageVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.sql.Connection;
import java.util.List;

/**
 * 数据源管理
 */
@Slf4j
@RestController
@RequestMapping("generator/v1/datasource")
@RequiredArgsConstructor
public class DatasourceController {

    private final IDatasourceService datasourceService;

    /**
     * 分页数据
     * @param datasourceQuery 查询对象
     * @return 分页数据
     */
    @GetMapping("page")
    public BasePageVO<DatasourceVO> page(@Valid DatasourceQuery datasourceQuery){
        return datasourceService.page(datasourceQuery);
    }

    /**
     * 根据 ID 获取数据
     * @param id ID
     * @return 数据信息
     */
    @GetMapping("{id}")
    public DatasourceVO get(@PathVariable("id") Long id){
        return datasourceService.getInfoById(id);
    }

    /**
     * 保存数据
     * @param datasourceForm 表单信息
     * @return true: 新增成功; false: 新增失败
     */
    @PostMapping
    public boolean save(@Valid DatasourceForm datasourceForm) throws BusinessException {
        return datasourceService.save(datasourceForm);
    }

    /**
     * 修改数据
     * @param datasourceForm 表单信息
     * @return true: 修改成功; false: 修改失败
     */
    @PutMapping
    public boolean update(@Valid DatasourceForm datasourceForm) throws EmptyObjectException {
        return datasourceService.update(datasourceForm);
    }

    /**
     * 删除修改数据
     * @param ids id 列表
     * @return true: 删除成功; false: 删除失败
     */
    @DeleteMapping
    public boolean delete(@RequestParam("ids") String ids){
        return datasourceService.deleteByIds(ids);
    }

    /**
     * 测试连接
     *
     * @param id 连接 ID
     * @return true: 测试成功; false: 测试失败
     */
    @GetMapping("test/{id}")
    public boolean test(@PathVariable("id") Long id) {
        // 根据 ID 查询实体
        DatasourceEntity entity = datasourceService.getById(id);
        Connection conn = null;
        try {
            conn = DbUtil.getConnection(new GenDataSource(entity));
            return true;
        } catch (Exception e) {
            log.error("连接失败，请检查配置信息. 异常信息: {}", e.getMessage());
            return false;
        } finally {
            DbUtil.close(conn);
        }
    }

    /**
     * 数据源下拉列表
     *
     * @return 数据源下拉列表
     */
    @GetMapping("/options")
    public List<Option<Long>> listOptions() throws BusinessException {
        return datasourceService.listOptions();
    }
}